package com.atguigu.yygh.common.handler;

import com.atguigu.yygh.common.exception.YyghException;
import com.atguigu.yygh.common.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLException;

// 全局统一异常处理
@RestControllerAdvice // 凡是由@ControllerAdvice标记的类都表示全局异常处理类
// Rest相当于@RequestBody // 表示当前类里面的方法返回JSON数据 不用额外在方法里面加@RequestBody
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(value = {SQLException.class})// 细粒度处理
    public R handleSQLException(SQLException sqlException){
        sqlException.printStackTrace();
        log.error(sqlException.getMessage());
        return R.error().message("SQL异常" + sqlException.getMessage());
    }

    @ExceptionHandler(value = {ArithmeticException.class})// 细粒度处理
    public R handleArithmeticException(ArithmeticException arithmeticException){
        arithmeticException.printStackTrace();
        log.error(arithmeticException.getMessage());
        return R.error().message("数学异常" + arithmeticException.getMessage());
    }

    @ExceptionHandler(value = {RuntimeException.class})// 粗粒度处理
    public R handleArithmeticException(RuntimeException runtimeException){
        runtimeException.printStackTrace();
        log.error(runtimeException.getMessage());
        return R.error().message("编译时异常" + runtimeException.getMessage());
    }

    @ExceptionHandler(value = {YyghException.class})// 粗粒度处理
    public R handleYyghException(YyghException yyghException){
        yyghException.printStackTrace();
        log.error(yyghException.getMessage());
        return R.error().
                message("预约挂号异常" + yyghException.getMessage()).
                code(yyghException.getCode());
    }
}
